package com.general.framework.zzyy.clone;

import org.utils.DeepCloneUtil;

import java.io.IOException;
import java.io.Serializable;
import java.util.StringJoiner;

public class CloneTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 先创建一个对象
        int[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0}; // 表示已经玩到最后了
        User user = new User(1, "hangman", "1234", "girl11", data);

        // 浅拷贝
        User user1 = (User) user.clone();

        // 深拷贝
        User user2 = (User) user.clone();
        // System.out.println(user1);
        // System.out.println(user2);
        User user3 = null;
        try {
            user3 = DeepCloneUtil.deepClone(user1);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        // 验证是否是浅拷贝
        user1.getData()[0] = 9;
        System.out.println(user1);
        System.out.println(user2);
        System.out.println(user3);

    }
}

class User implements Cloneable,Serializable {
    private int id; // 角色：可以是管理员，也可以是普通用户，也可以是氪金用户....
    private String username; // 用户名
    private String password; // 密码
    private String path; // 游戏图片
    private int[] data; // 游戏进度，这个我们可以用一维数组记录，也可以使用二维数组记录

    public User(int i, String username, String pwd, String path, int[] data) {
        this.id = i;
        this.username = username;
        this.password = pwd;
        this.path = path;
        this.data = data;
    }

    // 无参构造、有参构造、get、set方法

    // 这里重写了toString()方法，并且在最后拼接数组的时候单独写了一个 arrToString() 的方法，将数组变成字符串。
    // 这样子做相当于在展示用户信息里面数组的时候，展示的就不是地址值了。
    public String toString() {
        return "角色编号为：" + id + "，用户名为：" + username + "密码为：" + password + ", 游戏图片为:" + path + ", 进度:" + arrToString();
    }

    public String arrToString() {
        StringJoiner sj = new StringJoiner(", ", "[", "]");

        for (int i = 0; i < data.length; i++) {
            sj.add(data[i] + "");
        }
        return sj.toString();
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        // 调用父类的 clone()
        return super.clone();
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public int[] getData() {
        return data;
    }

    public void setData(int[] data) {
        this.data = data;
    }
}

